package com.zijidelu.luframework.infrastructure.converter;

import com.zijidelu.luframework.base.model.DataModel;
import com.zijidelu.luframework.base.model.PO;
import com.zijidelu.luframework.domain.model.entity.Entity;
import org.mapstruct.IterableMapping;
import org.mapstruct.MappingTarget;
import org.mapstruct.Named;

import java.util.List;

/**
 * 聚合转换器，包含领域实体
 * <p>
 * 适配没有聚合根的实体
 *
 * @author ZIJIDELU
 * @datetime 2025/11/14 09:46
 */
public interface AggregateConverter<P extends PO, D extends DataModel, E extends Entity<D>> extends DataConverter<P, D> {

    /**
     * 创建实体副本。
     *
     * @param source 源实体
     * @return 复制后的实体
     */
    E duplicateEntity(E source);

    /**
     * 复制实体。
     *
     * @param source 源实体
     * @param target 目标实体
     * @return 复制后的实体
     */
    E copyEntity(E source, @MappingTarget E target);

    /**
     * 实体 -> DataModel
     *
     * @param entity 实体
     * @return DataModel 数据模型
     */
    @Named("entityToDataMapping")
    D entityToData(E entity);

    /**
     * 实体列表 -> DataModel 列表
     *
     * @param entityList 实体列表
     * @return DataModel 列表
     */
    @IterableMapping(qualifiedByName = "entityToDataMapping")
    List<D> entityToDataList(List<E> entityList);

    /**
     * DataModel -> 实体
     *
     * @param data 数据模型
     * @return 实体
     */
    @Named("dataToEntityMapping")
    E dataToEntity(D data);

    /**
     * DataModel 列表 -> 实体 列表
     *
     * @param dataList DataModel 列表
     * @return 实体 列表
     */
    @IterableMapping(qualifiedByName = "dataToEntityMapping")
    List<E> dataToEntityList(List<D> dataList);

}
